package com.evangelion.core.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.primefaces.context.RequestContext;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import com.evangelion.core.bean.Alumno;
import com.evangelion.core.bean.Cliente;
import com.evangelion.core.bean.Horario;
import com.evangelion.core.bean.Profesor;
import com.evangelion.core.bean.Vehiculo;
import com.evangelion.core.utils.MensajesFace;

/**
 *
 * @author Usuario
 */
@ManagedBean
@ViewScoped
public class HorarioController extends MensajesFace implements Serializable {

    private boolean renderTable;
    private Horario horario;
    private Date fecha;
    private Date fechaInicio;
    private Date fechaFin;
    private String searchParamAlumno;
    private LazyDataModel<Alumno> listAlumno;

    private List<Horario> listHorario;
    private String diaSemana;
    private boolean renderTableProfesor;
    private boolean renderTableVehiculo;
    private Profesor profesor;
    private String searchParamProfesor;
    private LazyDataModel<Profesor> listProfesor;
    private List<Vehiculo> listVehiculo;

    private Cliente cliente;

    public void buscarListaAlumno() {
        configDataModelAlumno();
    }

    @SuppressWarnings("serial")
    public void configDataModelAlumno() {
        listAlumno = new LazyDataModel<Alumno>() {
            @Override
            public List<Alumno> load(int start, int max, String arg2,
                    SortOrder arg3, Map<String, String> arg4) {
                if (searchParamAlumno == null) {
                    searchParamAlumno = "";
                }
                System.out.println("A:" + searchParamAlumno);
                List<Alumno> listaAlu = (List) serviceAlunmo.searchByNifNombre(seccion, searchParamAlumno, start, max);
                System.out.println("B:" + listaAlu.size());
                return listaAlu;
            }
        };
        listAlumno.setRowCount(serviceAlunmo.countPage(seccion, searchParamAlumno));
    }

    public void buscarListaProfesor() {
        System.out.println("AuXXXX");
        configDataModel();
        System.out.println("Au");
        renderTableProfesor = true;
        System.out.println("Ab");
    }

    @SuppressWarnings("serial")
    public void configDataModel() {
        System.out.println("Ac");
        listProfesor = new LazyDataModel<Profesor>() {
            @Override
            public List<Profesor> load(int start, int max, String arg2,
                    SortOrder arg3, Map<String, String> arg4) {
                if (searchParamProfesor == null) {
                    searchParamProfesor = "";
                }
                System.out.println("A:::" + searchParamProfesor);
                return profesorService.searchByNifNombre(seccion, searchParamProfesor, start, max);

            }
        };
        System.out.println("jA");
        listProfesor.setRowCount(profesorService.countPage(seccion, searchParamProfesor));
    }

    public void buscarListaVehiculo() {
        listVehiculo = vehiculoService.findListByParamSeccion(seccion, "matricula", profesor.getVehiculo().getMatricula());
        renderTableVehiculo = true;
    }

    public void horarioNew() {

        listHorario = new ArrayList<Horario>();
        listHorario.add(new Horario("8:15", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));
        listHorario.add(new Horario("9:00", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));
        listHorario.add(new Horario("9:45", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));
        listHorario.add(new Horario("10:15", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));
        listHorario.add(new Horario("11:00", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));
        listHorario.add(new Horario("11:45", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));
        listHorario.add(new Horario("12:30", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));
        listHorario.add(new Horario("13:45", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));
        listHorario.add(new Horario("14:15", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));
        listHorario.add(new Horario("15:00", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));
        listHorario.add(new Horario("15:45", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));
        listHorario.add(new Horario("16:30", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));

        listHorario.add(new Horario("17:15", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));
        listHorario.add(new Horario("18:00", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));
        listHorario.add(new Horario("19:45", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));
        listHorario.add(new Horario("20:30", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));
        listHorario.add(new Horario("21:15", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));
        listHorario.add(new Horario("22:00", fechaInicio, fechaFin, null, null, null, null, null, seccion, profesor, cliente, "T"));

    }

    public void searchAlumno() {
    }

    public void getDayOfTheWeek() {
        boolean goodToGo = true;
        if (profesor == null || profesor.getId() == null) {
            msgInfoError("El campo \"Profesor\" es requerido");
            goodToGo = false;
        }
        if (null == fecha) {
            msgInfoError("El campo \"Semana\" es requerido");
            goodToGo = false;
        }

        if (goodToGo) {

            GregorianCalendar cal = new GregorianCalendar();
            cal.setTime(fecha);
            Integer correction = 1 - cal.get(GregorianCalendar.DAY_OF_WEEK);
            cal.add(Calendar.DATE, correction + 1);
            fechaInicio = cal.getTime();
            cal.add(Calendar.DATE, 5);
            fechaFin = cal.getTime();

            listHorario = horarioService.listBetweenDateByProf(seccion, fechaInicio, fechaFin, profesor);
            if (listHorario != null && !listHorario.isEmpty()) {
                msgAdvertencia("Esta semana ya ha sido agregada");
            } else {
                horarioNew();
            }
        }
    }

    public void newAlumno(Horario horario, String diaSemana) {
        renderTable = true;
        this.horario = horario;
        this.diaSemana = diaSemana;
    }

    public void deleteAlumno(Horario horario, String diaSemana) {
        renderTable = false;
        this.horario = horario;
        this.diaSemana = diaSemana;
        onRowDeleteAlumno();
    }

    @PostConstruct
    public void init() {
        super.init();

        listHorario = new ArrayList<Horario>();
        profesor = new Profesor();
        profesor.setVehiculo(new Vehiculo());
        searchParamProfesor = null;
        fechaInicio = null;
        fechaFin = null;
        fecha = null;

        cliente = new Cliente();

        listVehiculo = vehiculoService.findListByParamSeccion(seccion, "matricula", "");
    }

    private void limpiarForma() {

        listHorario = new ArrayList<Horario>();
        profesor = new Profesor();
        profesor.setVehiculo(new Vehiculo());
        searchParamProfesor = null;
        fechaInicio = null;
        fechaFin = null;
        fecha = null;
    }

    public void onRowDeleteAlumno() {
        for (Horario hor : listHorario) {
            if (horario.getHora().equals(hor.getHora())) {
                Alumno alumn = new Alumno();
                if (diaSemana.equals("Lunes")) {
                    hor.setLunes(null);
                    RequestContext.getCurrentInstance().execute("lazyload()");
                    return;

                }
                if (diaSemana.equals("Martes")) {
                    hor.setMartes(null);
                    RequestContext.getCurrentInstance().execute("lazyload()");
                    return;
                }
                if (diaSemana.equals("Miercoles")) {
                    hor.setMiercoles(null);
                    RequestContext.getCurrentInstance().execute("lazyload()");
                    return;
                }
                if (diaSemana.equals("Jueves")) {
                    hor.setJueves(null);
                    RequestContext.getCurrentInstance().execute("lazyload()");
                    return;
                }
                if (diaSemana.equals("Viernes")) {
                    hor.setViernes(null);
                    RequestContext.getCurrentInstance().execute("lazyload()");
                    return;
                }
            }
        }
    }

    public String formatFecha(Date date) {
        if (date != null) {
            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
            return sdf.format(date);
        }
        return "00/00/0000";
    }

    public void onRowSelectProfesor(Profesor profes) {
        renderTableProfesor = false;
        profesor = profes;
        searchParamProfesor = profes.getNombres() + " " + profes.getApellidos();
        RequestContext.getCurrentInstance().execute("updateProfParam()");
    }

    public void onRowSelectVehiculo(Vehiculo vehicul) {
        renderTableVehiculo = false;
        profesor.setVehiculo(vehicul);
//        RequestContext.getCurrentInstance().execute("updateVehiParam()");
    }

    public void save(String estado) {
        horarioService.save(listHorario, estado);
        profesorService.save(profesor);
        msgCambiosGuardados();
        limpiarForma();
    }

    public Profesor getProfesor() {
        return profesor;
    }

    public void setProfesor(Profesor profesor) {
        this.profesor = profesor;
    }

    public void onRowSelectAlumno(Alumno alumno) {
        renderTable = false;
        for (Horario hor : listHorario) {
            if (horario.getHora().equals(hor.getHora())) {
                if (diaSemana.equals("Lunes")) {
                    hor.setLunes(alumno);
                    return;
                }
                if (diaSemana.equals("Martes")) {
                    hor.setMartes(alumno);
                    return;
                }
                if (diaSemana.equals("Miercoles")) {
                    hor.setMiercoles(alumno);
                    return;
                }
                if (diaSemana.equals("Jueves")) {
                    hor.setJueves(alumno);
                    return;
                }
                if (diaSemana.equals("Viernes")) {
                    hor.setViernes(alumno);
                    return;
                }
                if (diaSemana.equals("Sabado")) {
                    hor.setSabado(alumno);
                    return;
                }
            }
        }
    }

    public List<Horario> getListHorario() {
        return listHorario;
    }

    public void setListHorario(List<Horario> listHorario) {
        this.listHorario = listHorario;
    }

    public Date getFechaInicio() {
        return fechaInicio;
    }

    public void setFechaInicio(Date fechaInicio) {
        this.fechaInicio = fechaInicio;
    }

    public Date getFechaFin() {
        return fechaFin;
    }

    public void setFechaFin(Date fechaFin) {
        this.fechaFin = fechaFin;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public boolean isRenderTable() {
        return renderTable;
    }

    public void setRenderTable(boolean renderTable) {
        this.renderTable = renderTable;
    }

    public String getSearchParamAlumno() {
        return searchParamAlumno;
    }

    public void setSearchParamAlumno(String searchParamAlumno) {
        this.searchParamAlumno = searchParamAlumno;
    }

    public LazyDataModel<Alumno> getListAlumno() {
        return listAlumno;
    }

    public void setListAlumno(LazyDataModel<Alumno> listAlumno) {
        this.listAlumno = listAlumno;
    }

    public Horario getHorario() {
        return horario;
    }

    public void setHorario(Horario horario) {
        this.horario = horario;
    }

    public boolean isRenderTableProfesor() {
        return renderTableProfesor;
    }

    public void setRenderTableProfesor(boolean renderTableProfesor) {
        this.renderTableProfesor = renderTableProfesor;
    }

    public String getSearchParamProfesor() {
        return searchParamProfesor;
    }

    public void setSearchParamProfesor(String searchParamProfesor) {
        this.searchParamProfesor = searchParamProfesor;
    }

    public boolean isRenderTableVehiculo() {
        return renderTableVehiculo;
    }

    public void setRenderTableVehiculo(boolean renderTableVehiculo) {
        this.renderTableVehiculo = renderTableVehiculo;
    }

    public List<Vehiculo> getListVehiculo() {
        return listVehiculo;
    }

    public void setListVehiculo(List<Vehiculo> listVehiculo) {
        this.listVehiculo = listVehiculo;
    }

    public LazyDataModel<Profesor> getListProfesor() {
        return listProfesor;
    }

    public void setListProfesor(LazyDataModel<Profesor> listProfesor) {
        this.listProfesor = listProfesor;
    }
}
